
package lexico;

import exceptions.ErroLexicoException;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;

/**
 * Classe para testes complexos incluindo strings que trabalham com a lista de <br>
 * erros do autômato.
 * @author Joao Carlos
 */
public class AutomatoTestWithInvalidTokens {

    public AutomatoTestWithInvalidTokens() {
    }

    @BeforeClass
    public static void setUpClass() throws Exception {
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
    }

    @Before
    public void setUp() {
    }

    @After
    public void tearDown() {
    }

    @Test
    public void testTokenInvalido() throws ErroLexicoException {
        Automato instance = new Automato();
        String textoFonte = "alG#orItmo";
        instance.controle(textoFonte);
        assertEquals("Valor incorreto de saída", "CARACTER INVALIDO", instance.listErro.get(0).getTipo());
        assertEquals("Valor incorreto de saída", "alG#orItmo", instance.listErro.get(0).getValor());
        textoFonte = "@123";
        instance.controle(textoFonte);
        assertEquals("Valor incorreto de saída", "CARACTER INVALIDO", instance.listErro.get(1).getTipo());
        assertEquals("Valor incorreto de saída", "@123", instance.listErro.get(1).getValor());
        textoFonte = "12@3";
        instance.controle(textoFonte);
        assertEquals("Valor incorreto de saída", "CARACTER INVALIDO", instance.listErro.get(2).getTipo());
        assertEquals("Valor incorreto de saída", "12@3", instance.listErro.get(2).getValor());
        textoFonte = "aaaaaa@";
        instance.controle(textoFonte);
        assertEquals("Valor incorreto de saída", "CARACTER INVALIDO", instance.listErro.get(3).getTipo());
        assertEquals("Valor incorreto de saída", "aaaaaa@", instance.listErro.get(3).getValor());
        textoFonte = "@aaaaaa@";
        instance.controle(textoFonte);
        assertEquals("Valor incorreto de saída", "CARACTER INVALIDO", instance.listErro.get(4).getTipo());
        assertEquals("Valor incorreto de saída", "@aaaaaa@", instance.listErro.get(4).getValor());
        textoFonte = "@aaaaaa";
        instance.controle(textoFonte);
        assertEquals("Valor incorreto de saída", "CARACTER INVALIDO", instance.listErro.get(5).getTipo());
        assertEquals("Valor incorreto de saída", "@aaaaaa", instance.listErro.get(5).getValor());
        textoFonte = "@#$";
        instance.controle(textoFonte);
        assertEquals("Valor incorreto de saída", "CARACTER INVALIDO", instance.listErro.get(6).getTipo());
        assertEquals("Valor incorreto de saída", "@#$", instance.listErro.get(6).getValor());
    }

    /**
     * Testo um caractere inválido no fim do token
     * @throws ErroLexicoException
     */
    @Test
    public void testTokenNumeroInvalidoFimDoToken() throws ErroLexicoException {
        Automato instance = new Automato();
        String textoFonte = "1233322@";
        instance.controle(textoFonte);
        assertFalse("Valor incorreto de saída", instance.listErro.isEmpty());
        
    }

    @Test
    public void testDuasPCInvalidas() throws ErroLexicoException {
        Automato instance = new Automato();
        String textoFonte = "alG#orItmo outro@Erro";
        instance.controle(textoFonte);
        assertEquals("Valor incorreto de saída", "CARACTER INVALIDO", instance.listErro.get(0).getTipo());
        assertEquals("Valor incorreto de saída", "CARACTER INVALIDO", instance.listErro.get(1).getTipo());
    }

    /**
     * Testo uma entrada com uma palavra válida e outra inválida
     * @throws ErroLexicoException
     */
    @Test
    public void testValidaInvalida() throws ErroLexicoException {
        Automato instance = new Automato();
        String textoFonte = "algoritmo outro@Erro";
        instance.controle(textoFonte);
        assertEquals("Valor incorreto de saída", "PALAVRACHAVE", instance.listagem.get(0).geteToke().toString());
        assertEquals("Valor incorreto de saída", "CARACTER INVALIDO", instance.listErro.get(0).getTipo());
        assertEquals("Valor incorreto de saída", "outro@Erro", instance.listErro.get(0).getValor());
    }

    /**
     * Testo uma entrada com uma palavra inválida e outra válida
     * @throws ErroLexicoException
     */
    @Test
    public void testInvalidaValida() throws ErroLexicoException {
        Automato instance = new Automato();
        String textoFonte = "outro@Erro algoritmo";
        instance.controle(textoFonte);
        assertEquals("Valor incorreto de saída", "PALAVRACHAVE", instance.listagem.get(0).geteToke().toString());
        assertEquals("Valor incorreto de saída", "CARACTER INVALIDO", instance.listErro.get(0).getTipo());
        assertEquals("Valor incorreto de saída", "outro@Erro", instance.listErro.get(0).getValor());
    }

    /**
     * Duas entrada com palavra inválida, uma em cada linha.
     * @throws ErroLexicoException
     */
    @Test
    public void testInvalidasQuebraLinha() throws ErroLexicoException {
        Automato instance = new Automato();
        String textoFonte = "erro@erro";
        instance.controle(textoFonte);
        textoFonte = "@erro@erro";
        instance.controle(textoFonte);
        assertEquals("Valor incorreto de saída", "CARACTER INVALIDO", instance.listErro.get(0).getTipo());
        assertEquals("Valor incorreto de saída", "erro@erro", instance.listErro.get(0).getValor());
        assertEquals("Valor incorreto de saída", "CARACTER INVALIDO", instance.listErro.get(1).getTipo());
        assertEquals("Valor incorreto de saída", "@erro@erro", instance.listErro.get(1).getValor());
    }

    /**
     * Duas entrada com palavra inválida, uma em cada linha.
     * @throws ErroLexicoException
     */
    @Test
    public void testNumerosInvalidosQuebraLinha() throws ErroLexicoException {
        Automato instance = new Automato();
        String textoFonte = "123@123";
        instance.controle(textoFonte);
        textoFonte = "@123";
        instance.controle(textoFonte);
        assertEquals("Valor incorreto de saída", "CARACTER INVALIDO", instance.listErro.get(0).getTipo());
        assertEquals("Valor incorreto de saída", "123@123", instance.listErro.get(0).getValor());
        assertEquals("Valor incorreto de saída", "CARACTER INVALIDO", instance.listErro.get(1).getTipo());
        assertEquals("Valor incorreto de saída", "@123", instance.listErro.get(1).getValor());
    }

}